Dependency Injection (DI) এমন একটি নকশা প্যাটার্ন যা একটি শ্রেণির (class) উপর নির্ভরশীলতা (dependencies) সরাসরি ম্যানুয়ালি তৈরি না করে বাহ্যিক উৎস থেকে সরবরাহ করা হয়। Guice-এর মতো DI ফ্রেমওয়ার্ক ব্যবহার করে tight coupling সমস্যাগুলি সমাধান করা সম্ভব হয়।
Tight Coupling কী?
- Tight Coupling হল এমন একটি পরিস্থিতি যেখানে একাধিক শ্রেণি (classes) পরস্পরের উপর দৃঢ়ভাবে নির্ভরশীল।
- এর ফলে:
- শ্রেণিগুলির পুনঃব্যবহারযোগ্যতা (reusability) হ্রাস পায়।
- পরীক্ষণ (testing) কঠিন হয়ে যায়।
- কোড মডিফাই করলে একটি শ্রেণির পরিবর্তন অন্য শ্রেণিতেও পরিবর্তন আনতে বাধ্য করে।
উদাহরণ:
public class BillingService {
private final PaymentService paymentService;
public BillingService() {
this.paymentService = new PaypalPaymentService(); // Tight coupling
}
public void processPayment() {
paymentService.pay();
}
}
class PaypalPaymentService implements PaymentService {
public void pay() {
System.out.println("Payment made via PayPal.");
}
}
interface PaymentService {
void pay();
}
সমস্যা:
BillingServiceসরাসরিPaypalPaymentService-এর উপর নির্ভরশীল।- নতুন
PaymentServiceযুক্ত করলেBillingServiceপরিবর্তন করতে হবে।
Guice এবং Dependency Injection-এর সমাধান
Guice Tight Coupling সমস্যার সমাধান করে Constructor Injection, Field Injection, এবং Method Injection ব্যবহার করে।
1. Constructor Injection
Guice @Inject ব্যবহার করে নির্ভরশীলতা ইনজেক্ট করতে সাহায্য করে।
import com.google.inject.Inject;
public class BillingService {
private final PaymentService paymentService;
@Inject
public BillingService(PaymentService paymentService) {
this.paymentService = paymentService;
}
public void processPayment() {
paymentService.pay();
}
}
2. Guice মডিউল এবং Binding
Guice AbstractModule ব্যবহার করে নির্ভরশীলতার রেজিস্ট্রেশন পরিচালনা করে।
import com.google.inject.AbstractModule;
public class BillingModule extends AbstractModule {
@Override
protected void configure() {
bind(PaymentService.class).to(PaypalPaymentService.class);
}
}
3. Main Method: Guice Injector
Guice-এর মাধ্যমে Injector ব্যবহার করে BillingService তৈরি করুন।
import com.google.inject.Guice;
import com.google.inject.Injector;
public class Main {
public static void main(String[] args) {
Injector injector = Guice.createInjector(new BillingModule());
BillingService billingService = injector.getInstance(BillingService.class);
billingService.processPayment();
}
}
Guice-এর মাধ্যমে Tight Coupling সমাধান
- Interfaces ব্যবহার:
- Guice নির্ভরশীলতাকে Interface দ্বারা নির্ধারণ করে, যা Implementation-এর উপর নির্ভরশীলতা কমায়।
- Binding Decoupling:
BillingServiceক্লাস সরাসরি নির্দিষ্টPaymentService-এর উপর নির্ভর করে না।- Guice মডিউল নির্ধারণ করে কোন
PaymentServiceব্যবহার হবে।
- পরিবর্তন এবং পরীক্ষণ সহজ:
- নতুন
PaymentServiceযোগ করা হলে শুধু মডিউলেbindপরিবর্তন করতে হবে। - Unit Testing-এ মক বা স্টাব (Mock/Stub) ব্যবহার করা সহজ।
- নতুন
Tight Coupling-এর উদাহরণ থেকে Loose Coupling-এ পরিবর্তন
Tight Coupling (Before Guice):
public class BillingService {
private final PaymentService paymentService;
public BillingService() {
this.paymentService = new PaypalPaymentService(); // Tight Coupling
}
public void processPayment() {
paymentService.pay();
}
}
Loose Coupling (After Guice):
public class BillingService {
private final PaymentService paymentService;
@Inject
public BillingService(PaymentService paymentService) {
this.paymentService = paymentService; // Decoupled
}
public void processPayment() {
paymentService.pay();
}
}
Guice vs Traditional DI Approaches
| বৈশিষ্ট্য | Traditional Approach | Guice Approach |
|---|---|---|
| Coupling | Tight Coupling | Loose Coupling |
| Configuration | ম্যানুয়াল ফ্যাক্টরি বা কনস্ট্রাক্টর ব্যবহৃত হয় | Annotation এবং মডিউল ব্যবহার |
| Flexibility | Implementation পরিবর্তন করা কঠিন | Binding পরিবর্তন করেই নতুন Implementation যুক্ত |
| Testability | Dependency Mocking কঠিন | সহজে Mock বা Stub তৈরি করা সম্ভব |
| Runtime Binding | নেই | Binding runtime-এ নির্ধারণ করা যায় |
- Guice DI Framework Tight Coupling সমস্যার কার্যকর সমাধান করে, যা ক্লাসগুলিকে আরো modular, flexible, এবং testable করে তোলে।
- Guice এর মাধ্যমে Constructor Injection ব্যবহার করলে শ্রেণিগুলির মধ্যে সরাসরি নির্ভরশীলতা দূর হয়।
- Guice শুধুমাত্র ছোট প্রজেক্ট নয়, বড় এবং জটিল প্রজেক্টেও কার্যকর যেখানে নির্ভরশীলতার সংখ্যা বেশি।
- Loose Coupling-এর জন্য Guice সহজ, লাইটওয়েট এবং কার্যকর সমাধান।
Read more